#ifndef FRAME_H_
#define FRAME_H_

/*
 * Tipo de dados para as variaveis
 * No caso de se pretender processar outros tipos de dados, ao n�vel do
 * armazenamento apenas � necess�rio extenter o enum var_type.
 */
typedef enum 
{
	v_integer, 	
	v_string,
	v_float, 	
	v_list,
	v_boolean
} var_type;

/*
 * Vari�veis
 */
typedef struct _v1
{
	var_type 	type;
	union{
		int  					integer;
		double  				real;
		char 					*string;				
		int 					boolean;				
		struct list_item	*list;		
	}value;	
} var;

/*
 * Estrutura para representar uma lista
 */
typedef struct _l2
{	
	var_type type;
	union
	{
		int  		int_value;
		double   real_value;
		char		*char_value;
		char 		*string_value;
		int 		bool_value;
		struct _l2 	*list_value;
	}value;
	struct _l2 *next;
}list_item;

/*
 * Em cada frame existe um ponteiro para a frame anterior, de onde sao recebidos os 
 * parametros, e um ponteiro para a frame onde estao definidas as variaveis locais e
 * onde estao os parametros das funcoes
 */
typedef struct _fx1{
    struct _fx1 *parent;		//Frame pointer - Amiente anterior
	struct _fx1 *master;		//Frame pointer - Amiente principal do bloco
	var *locals;				//Enderecamento de variaveis locais	
	int return_address;			//endereco do codigo na funcao chamante
}frame;

// uma estrutura para emular uma pilha
typedef struct stackNode{
  frame *content;
  struct stackNode *bellow;
} stackN;




#endif /*FRAME_H_*/
